package com.atguigu.gulimall.search;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**法大大面试总结:
 * 线程池的七大参数:
 * corePoolSize:核心线程数;线程池允许最多少个线程一直存在
 * MaximumPoolSize:最大线程数,允许线程池最多创建多少个线程;可以控制资源
 * keepAliveTime:线程存活时间,如果当前的线程数量大于核心线程竖向,就释放空闲的线程(最大线程数 - 核心线程数),只要线程空闲大于指定的keepAliveTime
 * unit:时间单位
 * BlockingQueue<Runnable> workQueue:阻塞队列没如果有很多任务,就会将目前多的任务放入队列中继续等待,只有线程空闲了,就会去队列里面取出新的任务继续执行,否则继续等待
 * threadFactory:线程的创建工厂
 * RejectedExecutionHandler handler:如果队列满了,按照我们指定的拒绝策略拒绝执行任务
 * 线程池的工作顺序:
 *    1:线程池的创建,准备好core数量的核心线程,准备接受任务
 *    2:新的任务进来,用core准备好的空闲线程去执行:
 *          1:core满了,就将再进来的任务放入阻塞队列中,空闲的core就会自己去阻塞队列获取任务并执行
 *          2:阻塞队列满了,就直接开辟新的线程,最大只能开辟到MaximumPoolSize指定的数量的线程
 *          3:MaximumPoolSize都执行好了,MaximumPoolSize - core的数量空闲的线程就会在keepAliveTime指定的时间后自动销毁,最终保持到core大小
 *          4:如果线程开到了MaximumPoolSize的数量,还是有新任务进来,就会使用我们指定的拒绝策略RejectedExecutionHandler处理
 *    3: 所有的线程创建都是由指定的factory创建的
 *
 **/
@EnableRedisHttpSession
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class )
public class GulimallSearchApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallSearchApplication.class, args);
    }

}
